package sany.iec.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author 托马斯
 * @Date 2025/7/6 0:14
 * @Description ExcelUtil
 */
@Slf4j
public class ExcelUtil {

    /**
     * 读取excerl表格得到数据信息
     * @param path : 文件
     * @param h    : 跳过指定的行数
     * @param l    : 跳过指定的列数
     * @return
     */
    public static Map<String, List<List<String>>> readExcel(String path, int h, int l) {
        Map<String, List<List<String>>> map = new HashMap<>();
        try {
            // 获取文件输入流
            InputStream inputStream = new FileInputStream(path);
            // 定义一个org.apache.poi.ss.usermodel.Workbook的变量
            Workbook workbook = null;
            // 截取路径名 . 后面的后缀名，判断是xls还是xlsx
            // 如果这个判断不对，就把equals换成 equalsIgnoreCase()
            if (path.substring(path.length() - 4).equals("xlsx")) {
                workbook = new XSSFWorkbook(inputStream);
            } else {
                workbook = new HSSFWorkbook(inputStream);
            }
            // 循环子表（跳过版本子表）
            for (int j = 0; j < workbook.getNumberOfSheets(); j++) {
                String sheetName = workbook.getSheetAt(j).getSheetName();
                // 获取第j张表
                Sheet sheet = workbook.getSheetAt(j);
                List<List<String>> sheetList = new ArrayList<>();
                // 取得第一行的列数
                int sum = sheet.getRow(0).getPhysicalNumberOfCells();
                // 循环读取每一行（跳过表头）
                for (int i = h; i < sheet.getPhysicalNumberOfRows(); i++) {
                    // 不断获取每一行数据
                    Row row = sheet.getRow(i);
                    // 查看每一行的第一列的单元格。如果为mull 或者 值为空，就不用继续读取了
                    if (row == null || row.getCell(0) == null) {
                        continue;
                    } else {
                        // 转换为字符串类型
                        row.getCell(0).setCellType(CellType.STRING);
                        if (StringUtils.isBlank(row.getCell(0).getStringCellValue())) {
                            continue;
                        }
                    }
                    List<String> list = new ArrayList<>();
                    // 循环遍历每一列
                    for (int index = l; index < sum; index++) {
                        // 获取数据，但是我们获取的cell类型
                        Cell cell = row.getCell(index);
                        if (cell == null) {
                            list.add("");
                            continue;
                        }
                        // 转换为字符串类型
                        cell.setCellType(CellType.STRING);
                        // 获取得到字符串
                        String str = cell.getStringCellValue();
                        list.add(str);
                    }
                    sheetList.add(list);
                }
                map.put(sheetName, sheetList);
            }
        } catch (Exception e) {
            log.error("文件解析失败，path: {}", path, e);
        }
        return map;
    }

    public static Boolean existExcel(String path) {
        File file = new File(path);
        return file.exists() && file.isFile(); // 检查文件是否存在且是普通文件（不是目录）
    }

    public static void main(String[] args) {
        Map<String, List<List<String>>> stringListMap = readExcel("C:/Users/chenxp/Desktop/iec104_modbus_server_01.xlsx", 0, 0);
        stringListMap.forEach((k, v) -> {
           log.info(k);
        });

        stringListMap.forEach((k, v) -> {
            log.info(k);
            for (int i = 0; i < v.size(); i++) {
                log.info("{} -- {}", i, v.get(i));
            }
        });

    }

}
